package com.kayb.patterns.behavioral;

/**
 * 模板方法，定义一个算法，算法包含若干个子算法，每个子算法由子类实现或重写
 * 场景：大部分类实现相同，可以考虑
 * vs 策略模式：策略模式侧重是一个整体可替换的算法，而模板方法侧重的是算法流程，里面的子算法可以被替换，但算法整体流程固定不变
 * @author huangkaibin
 * @date 2018-08-28
 **/
public class TemplateMethod {

    static abstract class AbstractTemplate {
        protected void step1() {
            System.out.println("step 1");
        }
        protected abstract void step2();

        public void handle() {
            step1();
            step2();
        }
    }

    static class A extends AbstractTemplate {

        @Override
        protected void step2() {
            System.out.println("step 2");
        }
    }

    static class B extends AbstractTemplate {

        @Override
        protected void step1() {
            System.out.println("B step 1");
        }

        @Override
        protected void step2() {
            System.out.println("step 2");
        }
    }

    public static void main(String[] args) {
        AbstractTemplate template = new A();
        template.handle();

        template = new B();
        template.handle();
    }
}
